package com.cloud.position.xlctawler.service;

import com.cloud.position.xlctawler.entity.JobInfoDto;
import org.jsoup.Jsoup;
import org.springframework.stereotype.Service;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 51job spider
 */
@Service("spiderJobService")
public class SpiderJobService implements PageProcessor {
    private Site site = Site.me()
            .setCharset("gbk")  //设置编码
            .setTimeOut(10*1000)   //设置超时时间
            .setSleepTime(3000)  //设置重试间隔时间
            .setRetryTimes(3);  //设置重试次数

    @Override
    public void process(Page page) {
        //解析页面 获取信息详情的url
        List<Selectable> list =  page.getHtml().css("div.el p.t1 span a").nodes();
        //判断获取到的集合是否为空
        if(list.size() == 0){
            //如果为空 表示这是招聘详情页 解析页面 获取招聘详情 保存数据
            saveJobInfo(page);  //调用方法保存数据  这个方法写下面啦
        }else {
            //如果不为空 表示这是列表页 解析出详情页的url 放到任务队列中
            for (Selectable selectable:list){
                //获取url地址
                String jobInfo = selectable.links().toString();
                //把获取的url地址放到任务队列中
                page.addTargetRequest(jobInfo);
            }
            //获取下一页的的url
            String urlSource =  page.getHtml().css("div.p_in li.bk").regex("<a[\\s\\S]*?下一页</a>").toString();

            if(urlSource!=null&&!urlSource.trim().equals("")){
                // 按指定模式在字符串查找
                String pattern = "<a href=\"(.*)\"";

                // 创建 Pattern 对象
                Pattern r = Pattern.compile(pattern);

                // 现在创建 matcher 对象
                Matcher m = r.matcher(urlSource);
                if (m.find( )) {
                    String url = m.group(1);
                    //把下一页的url加入任务队列中
                    //***************************************************************************
                    page.addTargetRequest(url);
                    //***************************************************************************
                }
            }else{
                System.out.println("获取下一页的的url"+urlSource);
            }


        }
    }

    //解析页面,获取招聘详情信息.保存数据
    private void saveJobInfo(Page page){
        //创建招聘详情对象
        JobInfoDto jobInfo = new JobInfoDto();
        //解析解析页面
        Html html = page.getHtml();
        //保存数据,封装到对象中
        jobInfo.setCompanyAddr(Jsoup.parse(html.css("div.bmsg").nodes().get(1).toString()).text());
        jobInfo.setCompanyInfo(Jsoup.parse(html.css("div.tmsg").toString()).text());
        jobInfo.setCompanyName(html.css("div.cn p.cname a","text").toString());
        // jobInfo.setId();  ID不写 是自增的
        jobInfo.setJobInfo(Jsoup.parse(html.css("div.job_msg").toString()).text());
        jobInfo.setJobName(html.css("div.cn h1","text").toString());
        //获取薪资
        Integer[] salary = SalaryMath.getSalary(html.css("div.cn strong", "text").toString());
        jobInfo.setSalaryMax(salary[1]);
        jobInfo.setSalaryMin(salary[0]);
        //获取发布时间
        String content = Jsoup.parse(html.css("div.cn p").regex(".*发布").toString()).text();
        jobInfo.setTime(content.substring(content.length()-7,content.length()-2));
        jobInfo.setUrl(page.getUrl().toString());


        // 上面的内容设置完成后将结果保存在内存中
        page.putField("JobInfo",jobInfo);
        //实际上数据存放在resultItems中

    }

    @Override
    public Site getSite() {
        return site;
    }
}
